#include "SysTick.h"

static u32  fac_us=0;							//us延时倍乘数

/************
* 函数名：SysTick_Init
* 功能：初始化SysTick，SYSTICK时钟固定为AHB时钟
* 输入：SYSCLK系统时钟频率
* 输出：无
*************/
void SysTick_Init(u8 SYSCLK)
{
	HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK); 	// SysTick频率为HCLK
	fac_us = SYSCLK;					// 保存1us所需要的计数次数
}

// 延时nus
// 参数：nus为要延时的us数
// nus：0~190887435（最大：2^32/fac_us@fac_us=22.5）
void delay_us(u32 nus)
{
	u32 ticks;
	u32 told,tnow,tcnt=0;
	u32 reload=SysTick->LOAD;		// LOAD的值
	ticks = nus*fac_us;					// 需要的节拍数
	told = SysTick->VAL;				// 刚进入时计数器值
	while(1)
	{
		tnow = SysTick->VAL;
		if(tnow != told)
		{
			if(tnow < told)tcnt+=told-tnow;	// 注意SYSTICK是一个递减的计数器即可
			else tcnt+=reload-tnow+told;
			told = tnow;
			if(tcnt >= ticks) break;				// 时间超过/等于延迟时间，退出
		}
	}
}

// 延时nms
// nms：要延时的ms数
void delay_ms(u16 nms)
{
	u32 i;
	for(i=0;i<nms;i++) delay_us(1000);
}